package com.lml.jdk8.localdate.java8Time;

import org.junit.jupiter.api.Test;

import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.temporal.Temporal;
import java.time.temporal.TemporalAdjuster;
import java.time.temporal.TemporalAdjusters;

/**
 * @author luomingliang
 * @date 2021/9/12 18:52
 */
public class PayDayAdjuster implements TemporalAdjuster {
    /**
     * 假如员工一个月中领取工资，发薪日是每个月的15号，如果发薪日是周末，则调整为周五。
     * <p>
     * 思路：之后会传入一个日期对象，判断那日期对象是不是15号，如果不是15号则改为15号，
     * 再判断日期是周六或周日，则改为周五（上一个）
     */
    @Override
    public Temporal adjustInto(Temporal temporal) {
        /* Temporal是日期时间类对象的父接口，实际上可以理解为传入的就是LocalDate或者说LocalTime对象，需要将temporal转换为LocalDate对象 */
        LocalDate payDay = LocalDate.from(temporal);
        //2.判断当前封装的时间日期是不是当月15日，如果不是，则修改为15日。
        int day;
        if (payDay.getDayOfMonth() != 15) {
            day = 15;
        } else {
            day = payDay.getDayOfMonth();
        }
        LocalDate realPayDay = payDay.withDayOfMonth(day);
        //3.判断realPayDay对象中封装的星期数是不是周六或者是周日，如果是则改为上一个周五
        if (realPayDay.getDayOfWeek() == DayOfWeek.SATURDAY || realPayDay.getDayOfWeek() == DayOfWeek.SUNDAY) {
            realPayDay = realPayDay.with(TemporalAdjusters.previous(DayOfWeek.FRIDAY));
        }
        return realPayDay;
    }

    @Test
    public void test01() {
        //封装LocalDate对象为2018年12月1日
        LocalDate payDay = LocalDate.of(2018, 12, 15);
        //计算payDay的真实发薪日是什么时候
        LocalDate realPayDay = LocalDate.from(new PayDayAdjuster().adjustInto(payDay));
        System.out.println("预计发信日是：" + payDay + "，真实发薪日是：" + realPayDay);
    }

}
